import jwt from 'jsonwebtoken';
import config from '../config.js';

const authenticateToken = (req, res, next) => {
  // 从请求头获取token
  const authHeader = req.headers.authorization;
  const token = authHeader && authHeader.split(' ')[1]; // Bearer Token格式
  
  if (!token) {
    return res.status(401).json({ message: '访问被拒绝，未提供授权令牌' });
  }
  
  try {
    // 验证token
    const decoded = jwt.verify(token, config.jwt.secret);
    
    // 确保解码后的令牌包含用户ID
    if (!decoded || !decoded.id) {
      return res.status(403).json({ message: '无效的授权令牌格式' });
    }
    
    req.user = decoded;
    next();
  } catch (error) {
    console.error('令牌验证失败:', error.message);
    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({ message: '令牌已过期，请重新登录' });
    }
    return res.status(403).json({ message: '无效的授权令牌' });
  }
};

// 可选的认证中间件，未认证时仍可访问，但不能使用需要用户信息的功能
const optionalAuthenticateToken = (req, res, next) => {
  // 从请求头获取token
  const authHeader = req.headers.authorization;
  const token = authHeader && authHeader.split(' ')[1]; // Bearer Token格式
  
  if (!token) {
    // 没有令牌时，继续处理请求，但没有用户信息
    req.user = null;
    return next();
  }
  
  try {
    // 验证token
    const decoded = jwt.verify(token, config.jwt.secret);
    
    // 确保解码后的令牌包含用户ID
    if (!decoded || !decoded.id) {
      req.user = null;
    } else {
      req.user = decoded;
    }
    next();
  } catch (error) {
    // 令牌无效时，继续处理请求，但没有用户信息
    console.warn('可选令牌验证失败:', error.message);
    req.user = null;
    next();
  }
};

export { authenticateToken, optionalAuthenticateToken }; 